home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 1833 / 1833.xpi / chrome / yoono.jar / content / yoono / dialogs / mktree.js < prev    next >
Text File  |  2009-12-16  |  6KB  |  178 lines

  1. // ===================================================================
  2. // Author: Matt Kruse <matt@mattkruse.com>
  3. // WWW: http://www.mattkruse.com/
  4. //
  5. // NOTICE: You may use this code for any purpose, commercial or
  6. // private, without any further permission from the author. You may
  7. // remove this notice from your final code if you wish, however it is
  8. // appreciated by the author if at least my web site address is kept.
  9. //
  10. // You may *NOT* re-distribute this code in any way except through its
  11. // use. That means, you can include it in your product, or your web
  12. // site, or any other form where the code is actually being used. You
  13. // may not put the plain javascript up on your site for download or
  14. // include it in your javascript libraries for download. 
  15. // If you wish to share this code with others, please just point them
  16. // to the URL instead.
  17. // Please DO NOT link directly to my .js files from your site. Copy
  18. // the files to your server and use them there. Thank you.
  19. // ===================================================================
  20.  
  21. // HISTORY
  22. // ------------------------------------------------------------------
  23. // December 9, 2003: Added script to the Javascript Toolbox
  24. // December 10, 2003: Added the preProcessTrees variable to allow user
  25. //      to turn off automatic conversion of UL's onLoad
  26. // March 1, 2004: Changed it so if a <li> has a class already attached
  27. //      to it, that class won't be erased when initialized. This allows
  28. //      you to set the state of the tree when painting the page simply
  29. //      by setting some <li>'s class name as being "liOpen" (see example)
  30. /*
  31. This code is inspired by and extended from Stuart Langridge's aqlist code:
  32.         http://www.kryogenix.org/code/browser/aqlists/
  33.         Stuart Langridge, November 2002
  34.         sil@kryogenix.org
  35.         Inspired by Aaron's labels.js (http://youngpup.net/demos/labels/) 
  36.         and Dave Lindquist's menuDropDown.js (http://www.gazingus.org/dhtml/?id=109)
  37. */
  38.  
  39. // Automatically attach a listener to the window onload, to convert the trees
  40. addEvent(window,"load",convertTrees);
  41.  
  42. // Utility function to add an event listener
  43. function addEvent(o,e,f){
  44.     if (o.addEventListener){ o.addEventListener(e,f,true); return true; }
  45.     else if (o.attachEvent){ return o.attachEvent("on"+e,f); }
  46.     else { return false; }
  47. }
  48.  
  49. // utility function to set a global variable if it is not already set
  50. function setDefault(name,val) {
  51.     if (typeof(window[name])=="undefined" || window[name]==null) {
  52.         window[name]=val;
  53.     }
  54. }
  55.  
  56. // Full expands a tree with a given ID
  57. function expandTree(treeId) {
  58.     var ul = document.getElementById(treeId);
  59.     if (ul == null) { return false; }
  60.     expandCollapseList(ul,nodeOpenClass);
  61. }
  62.  
  63. // Fully collapses a tree with a given ID
  64. function collapseTree(treeId) {
  65.     var ul = document.getElementById(treeId);
  66.     if (ul == null) { return false; }
  67.     expandCollapseList(ul,nodeClosedClass);
  68. }
  69.  
  70. // Expands enough nodes to expose an LI with a given ID
  71. function expandToItem(treeId,itemId) {
  72.     var ul = document.getElementById(treeId);
  73.     if (ul == null) { return false; }
  74.     var ret = expandCollapseList(ul,nodeOpenClass,itemId);
  75.     if (ret) {
  76.         var o = document.getElementById(itemId);
  77.         if (o.scrollIntoView) {
  78.             o.scrollIntoView(false);
  79.         }
  80.     }
  81. }
  82.  
  83. // Performs 3 functions:
  84. // a) Expand all nodes
  85. // b) Collapse all nodes
  86. // c) Expand all nodes to reach a certain ID
  87. function expandCollapseList(ul,cName,itemId) {
  88.     if (!ul.childNodes || ul.childNodes.length==0) { return false; }
  89.     // Iterate LIs
  90.     for (var itemi=0;itemi<ul.childNodes.length;itemi++) {
  91.         var item = ul.childNodes[itemi];
  92.         if (itemId!=null && item.id==itemId) { return true; }
  93.         if (item.nodeName == "LI") {
  94.             // Iterate things in this LI
  95.             var subLists = false;
  96.             for (var sitemi=0;sitemi<item.childNodes.length;sitemi++) {
  97.                 var sitem = item.childNodes[sitemi];
  98.                 if (sitem.nodeName=="UL") {
  99.                     subLists = true;
  100.                     var ret = expandCollapseList(sitem,cName,itemId);
  101.                     if (itemId!=null && ret) {
  102.                         item.className=cName;
  103.                         return true;
  104.                     }
  105.                 }
  106.             }
  107.             if (subLists && itemId==null) {
  108.                 item.className = cName;
  109.             }
  110.         }
  111.     }
  112. }
  113.  
  114. // Search the document for UL elements with the correct CLASS name, then process them
  115. function convertTrees() {
  116.     setDefault("treeClass","mktree");
  117.     setDefault("nodeClosedClass","liClosed");
  118.     setDefault("nodeOpenClass","liOpen");
  119.     setDefault("nodeBulletClass","liBullet");
  120.     setDefault("nodeLinkClass","bullet");
  121.     setDefault("preProcessTrees",true);
  122.     if (preProcessTrees) {
  123.         if (!document.createElement) { return; } // Without createElement, we can't do anything
  124.         uls = document.getElementsByTagName("ul");
  125.         for (var uli=0;uli<uls.length;uli++) {
  126.             var ul=uls[uli];
  127.             if (ul.nodeName=="UL" && ul.className==treeClass) {
  128.                 processList(ul);
  129.             }
  130.         }
  131.     }
  132. }
  133.  
  134. // Process a UL tag and all its children, to convert to a tree
  135. function processList(ul) {
  136.     if (!ul.childNodes || ul.childNodes.length==0) { return; }
  137.     // Iterate LIs
  138.     for (var itemi=0;itemi<ul.childNodes.length;itemi++) {
  139.         var item = ul.childNodes[itemi];
  140.         if (item.nodeName == "LI") {
  141.             // Iterate things in this LI
  142.             var subLists = false;
  143.             for (var sitemi=0;sitemi<item.childNodes.length;sitemi++) {
  144.                 var sitem = item.childNodes[sitemi];
  145.                 if (sitem.nodeName=="UL") {
  146.                     subLists = true;
  147.                     processList(sitem);
  148.                 }
  149.             }
  150.             var s= document.createElement("SPAN");
  151.             var t= '\u00A0'; //  
  152.             s.className = nodeLinkClass;
  153.             if (subLists) {
  154.                 // This LI has UL's in it, so it's a +/- node
  155.                 if (item.className==null || item.className=="") {
  156.                     item.className = nodeClosedClass;
  157.                 }
  158.                 // If it's just text, make the text work as the link also
  159.                 if (item.firstChild.nodeName=="#text") {
  160.                     t = t+item.firstChild.nodeValue;
  161.                     item.removeChild(item.firstChild);
  162.                 }
  163.                 s.onclick = function () {
  164.                     this.parentNode.className = (this.parentNode.className==nodeOpenClass) ? nodeClosedClass : nodeOpenClass;
  165.                     return false;
  166.                 }
  167.             }
  168.             else {
  169.                 // No sublists, so it's just a bullet node
  170.                 item.className = nodeBulletClass;
  171.                 s.onclick = function () { return false; }
  172.             }
  173.             s.appendChild(document.createTextNode(t));
  174.             item.insertBefore(s,item.firstChild);
  175.         }
  176.     }
  177. }
  178.